////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENTINPUT_H_
#define _CLIENTINPUT_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _COMMONTYPES_H_
#include "commontypes.h"
#endif

////////////////////////////////////////////////////////////////////////////////

#ifndef _BUFFER_H_
#include "buffer.h"
#endif

////////////////////////////////////////////////////////////////////////////////


/** This class represents client input
*
*
*  @author   Roman Pasechnik
*  @since    Jul 01th, 2009
*  @updated  Nov 11th, 2009
*/
class ClientInput
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientInput();


    /** Constructor from buffer */
    ClientInput( Buffer& _buffer );


    /** Destructor */
    ~ClientInput();


    /** Reset client input */
    void Reset();


////////////////////////////////////////////////////////////////////////////////


    /** Button accessors */
    bool IsUpPressed() const;
    bool IsDownPressed() const;
    bool IsLeftPressed() const;
    bool IsRightPressed() const;
    bool IsShootPressed() const;
    bool IsTabPressed() const;


    /** Button Setters */
    void SetUpPressed( bool _isPressed );
    void SetDownPressed( bool _isPressed );
    void SetLeftPressed( bool _isPressed );
    void SetRightPressed( bool _isPressed );
    void SetShootPressed( bool _isPressed );
    void SetTabPressed(bool _isPressed );


    /** Additional routines */
    bool IsGoingUp() const;
    bool IsGoingDown() const;
    bool IsGoingLeft() const;
    bool IsGoingRight() const;


////////////////////////////////////////////////////////////////////////////////


    /** Gets player mouse position */
    const Point& GetMousePosition() const;


    /** Sets player mouse position */
    void SetMousePosition( const Point& _position );


////////////////////////////////////////////////////////////////////////////////


    /** Gets player actions */
    unsigned int GetActions() const;


    /** Sets player actions */
    void SetActions( unsigned int _actions );


////////////////////////////////////////////////////////////////////////////////


    /** Equality */
    bool InputChanged( const ClientInput& _prevInput ) const;
    bool ActionsChanged( const ClientInput& _prevInput ) const;
    bool MousePositionChanged( const ClientInput& _prevInput ) const;


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Keyboard and mouse buttons state */
    bool m_IsUpPressed;
    bool m_IsDownPressed;
    bool m_IsLeftPressed;
    bool m_IsRightPressed;
    bool m_IsShootPressed;

    bool m_IsTabPressed;


    /** Mouse position on screen */
    Point m_MousePosition;


////////////////////////////////////////////////////////////////////////////////


    /** Possible client actions */
    enum ActionMask
    {
        UP     = 0x00000001,
        DOWN   = 0x00000002,
        LEFT   = 0x00000004,
        RIGHT  = 0x00000008,

        SHOOT  = 0x00000010,

        TAB    = 0x00000020
    };


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
